(*
  * Copyright (c) 2010-2012 Thundax Delphi Physics Engine
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
  * met:
  *
  * * Redistributions of source code must retain the above copyright
  *   notice, this list of conditions and the following disclaimer.
  *
  * * Redistributions in binary form must reproduce the above copyright
  *   notice, this list of conditions and the following disclaimer in the
  *   documentation and/or other materials provided with the distribution.
  *
  * * Neither the name of 'TDPE' nor the names of its contributors
  *   may be used to endorse or promote products derived from this software
  *   without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *)
unit tdpe.lib.automation.valve;

interface

Uses tdpe.lib.particle.group, tdpe.lib.particle.box.solid, tdpe.lib.particle.spring.restriction,
  tdpe.lib.engine, tdpe.lib.render, Graphics;

type

  TValve = class(TGroup)
  private
    Fbox: TSolidBox;
    Fdosification: Boolean;
    Fopen: Boolean;
    FClose: Boolean;
    Finitial: Double;
    Flimit: integer;
  public
    Constructor Create(aRenderer: TAbstractRenderer; aEngine: TEngine; ini: Double; color: TColor); Reintroduce;
    Destructor Destroy(); override;
    procedure Dosification();
    procedure Open();
    procedure Close();
  end;

implementation

uses tdpe.lib.particle.abstract.collection, SysUtils;

{ TValve }

procedure TValve.Close;
begin
  if Fbox.px <= Finitial + Flimit then
    FClose := true;
  if Fbox.px = Finitial then
    FClose := false;
  if FClose then
    Fbox.px := Fbox.px - 0.5;
end;

constructor TValve.Create(aRenderer: TAbstractRenderer; aEngine: TEngine; ini: Double; color: TColor);
begin
  inherited Create(true);
  Finitial := ini;
  Flimit := 28;
  Fbox := TSolidBox.Create(Finitial, 112, Flimit, 6, 0, true, 1, 0.3, 0.3, 0, color);
  Fbox.SetRenderer(aRenderer);
  addParticle(Fbox);
end;

destructor TValve.Destroy;
begin
  FreeAndNil(Fbox);
  inherited;
end;

procedure TValve.Dosification;
begin
  if Fbox.px = Finitial then
    Fdosification := true;
  if Fbox.px = Finitial + Flimit then
    Fdosification := false;
  if Fdosification then
    Fbox.px := Fbox.px + 0.5
  else
    Fbox.px := Fbox.px - 0.5;
end;

procedure TValve.Open;
begin
  if Fbox.px >= Finitial then
    Fopen := true;
  if Fbox.px = Finitial + Flimit then
    Fopen := false;
  if Fopen then
    Fbox.px := Fbox.px + 0.5;
end;

end.
